package com.liuyz.demo2;

public class 成员内部类 {
    public static void main(String[] args) {
        new Outer03().m2();
        System.out.println("=============");
        new OtherOuter03().o1();
        System.out.println("=============");
        new OtherOuter03().o2();
    }
}

class Outer03 { // 外部类
    private int n1 = 200;

    private int n2 = 500;

    private void m1() {
        System.out.println("Outer03->m1()");
    }

    public void m2() {
        // 外部类的方法调用成员内部类
        Inner03 inner03 = new Inner03(); // 创建对象
        inner03.i1(); // 调用方法
    }

    class Inner03 { // 成员内部类

        private int n2 = 1000;

        public void i1() {
            System.out.println("Inner03->i1()");
            System.out.println("Outer03->n1->" + n1); // 成员内部类访问外部类的私有属性
            m1(); // 成员内部类访问外部类的私有方法
            System.out.println("Inner03->n2->" + n2); // 成员内部类的属性
            System.out.println("Outer03->n2->" + Outer03.this.n2); // 外部类的属性
        }
    }

    // 其他外部类调用成员内部类：方法二
    public Inner03 getInner03() { // 在外部类中编写一个可以返回成员内部类的对象的方法
        return new Inner03();
    }

}

class OtherOuter03 { // 其他外部类
    public void o1() {
        // 其他外部类调用成员内部类：方法一
        Outer03 outer03 = new Outer03(); // 创建外部类的对象
        Outer03.Inner03 inner03 = outer03.new Inner03(); // 通过外部类的对象创建成员内部类的对象
        inner03.i1(); // 通过成员内部类的对象调用方法
    }

    public void o2() {
        Outer03 outer03 = new Outer03(); // 创建外部类的对象
        Outer03.Inner03 inner03 = outer03.getInner03(); // 在外部其他类中调用方法获取成员内部类的对象
        inner03.i1(); // 通过成员内部类的对象调用方法
    }
}
